//
// Created by Scave on 2025/10/5.
//

#ifndef TIEC_PLUGIN_H
#define TIEC_PLUGIN_H

#include "compiler.h"

namespace NS_TIEC {
  class CompilerApiInternalImpl;
  /// 编译器Api接口类
  class CompilerApi {
  public:
    explicit CompilerApi(UPTR<CompilerApiInternalImpl>&& impl);

    /// 添加一个任务监听器
    /// @param listener 监听器实现
    void addTaskListener(const PTR<TaskListener>& listener) const;

    /// 移除一个任务监听器
    void removeTaskListener(const PTR<TaskListener>& listener) const;

    /// 为安卓平台注册依赖库搜寻器
    /// @param resolver AndroidLibResolver实例指针
    void addAndroidLibResolver(const PTR<AndroidLibResolver>& resolver) const;
  private:
    UPTR<CompilerApiInternalImpl> impl_;
  };

  /// 编译器插件
  class CompilerPlugin {
  public:
    /// 插件实现逻辑，可通过Compiler的接口向编译器注册组件
    virtual void apply(const UPTR<CompilerApi>& api) = 0;
  };

  class CompilerPluginRegistry {
  public:
    CompilerPluginRegistry(String&& name, FUNCTION<UPTR<CompilerPlugin>()> factory);
  };

/// 注册一个插件
/// @param name 插件名称
/// @param plugin_class 插件类名
#define REGISTER_PLUGIN(name, plugin_class) \
  static NS_TIEC::CompilerPluginRegistry registry_##plugin_class(name, []() { \
    return MAKE_UPTR<plugin_class>(); \
  });

}

#endif //TIEC_PLUGIN_H
